from langchain_community.document_loaders import WebBaseLoader
from langchain_community.tools import TavilySearchResults
from langchain_community.vectorstores import FAISS
from langchain_core.tools import create_retriever_tool
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.agents import create_tool_calling_agent,AgentExecutor
# 导入官方的提示词仓库
from langchain import hub
import os

#获取网站信息
loader = WebBaseLoader("https://blog.csdn.net/ChaoMing_H/article/details/141346832")
docs = loader.load()

# 对文档进行分块
documents = RecursiveCharacterTextSplitter(
    # chunk_size 用于指定每个文档块的大小，单位为字符。
    # chunk_overlap 用于指定每个文档块之间重叠的大小。这就意味着，当文档被拆分成较小的块时，每个块的末尾部分会与下一个块的开头部分重叠的字符大小。
    # 第一个块包含字符1到1000，第二个块包含字符801到1800，第三个块包含字符1601到2600。
    chunk_size=1000, chunk_overlap=200).split_documents(docs)

vectory = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vectory.as_retriever()

print("检索结果:",retriever.invoke("向量数据库")[0])

# 创建检索工具
retriever_tool = create_retriever_tool(
    retriever,
    name="web_search_tool",
    description="用于搜索互联网上的信息"
)

# 创建搜索工具
search = TavilySearchResults(max_results=2)

# 定义模型
llm = ChatOpenAI(model_name="gpt-4", base_url=os.environ["OPENAI_BASE_URL"])

# 创建工具列表
tools = [search, retriever_tool]

#获取要使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")
print(f"获取到的提示信息为:{prompt.messages}")

# 创建代理
agent = create_tool_calling_agent(
    llm=llm,
    tools=tools,
    prompt=prompt
)

# 创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

print(f"agent的执行结果为:{agent_executor.invoke({'input': '如何使用向量数据库?今天广州的天气如何？'})}")
